Mongodb auth验证

mongodb默认不启用授权认证,只要能连接到该服务器,就可连接到mongod。在本地开发的时候我们经常会忽略掉auth,只有到了生产环节才会启用auth。很多经验不多的童鞋甚至部署到生产环节都没有启用认证!但这是不安全的,因为这样相当于你的数据库直接暴露在公网,不对bindIp进行验证的话,任何机器都能够访问你的MongoDB就不好了。

Mongodb使用 auth

通过命令行启动

1
mongod --dbpath /export/mongo/ --auth

修改配置文件

打开mongod.conf

1
2
3
4
5
6
7
vi /etc/mongo/mongod.conf
# 加入2行
security:
authorization: enabled

# 启动
mongod -f mongod.conf

在实际生产环境中,我们通常采用第二种方法。

下面看看如何创建访问控制权限

mongoDB 没有超级无敌用户root,只有能管理用户的用户 userAdminAnyDatabase。

添加用户

1
2
3
4
5
6
7
8
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

在mongo shell中执行以上命令,我们就创建了一个管理员账号!

接下来,我们添加某个库的用户

1
2
3
4
5
6
7
8
use test
db.createUser(
{
user: "test",
pwd: "test",
roles: [ { role: "userAdminAnyDatabase", db: "test" } ]
}
)

这里需要说明下:默认情况下我们在对应的库下添加用户,用户跟着库走!当然你也可以在admin库下,直接添加,但是admin创建的,只能先进入admin后再进行切换!

第一次创建admin账号后,需要重启mongo服务!让auth生效!如果已经启用auth,后续增加用户不用重启!

查看创建的用户

所有用户都存在amdin库下的 system.users 这个表中!

1
2
use admin
db.system.users.find()

当然也可以用 show users 查看刚刚创建的用户

使用新的用户登录mongo shell

中断mongo shell,重新登录

1
mongo 127.0.0.1/test -utest -ptest

上面即用创建的test账号登录test库下,执行show collections可以查看到test库下的所有表。

不中断mnongo shell

1
2
use test
db.auth('test', 'test') #授权下

增删角色

1
2
3
4
# 授予角色
db.grantRolesToUser( "myuser" , [ { role: "dbOwner", db: "mydb" } ])
# 取消角色
db.revokeRolesFromUser( "myuser" , [ { role: "readWrite", db: "mydb" } ])

这个非常有用,对于我们控制权限非常有帮助!!

例子-在admin账号中添加一个权限,这样admin账户对所有databases都可以操作!

1
db.grantRolesToUser( "admin" , [ { role: "readWriteAnyDatabase", db: "admin" } ])

角色参考表